package huashi.z_interceptor;


import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.apache.oltu.oauth2.client.OAuthClient;
import org.apache.oltu.oauth2.client.URLConnectionClient;
import org.apache.oltu.oauth2.client.request.OAuthBearerClientRequest;
import org.apache.oltu.oauth2.client.request.OAuthClientRequest;
import org.apache.oltu.oauth2.client.response.OAuthResourceResponse;
import org.apache.oltu.oauth2.common.OAuth;
import org.apache.oltu.oauth2.common.exception.OAuthProblemException;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;


public class Helper {
	
	/**
	 * 1、登陆拦截里面的方法
	 * 获取的是客户端请求里的cookie中key为code的值
	 */
	public static String interceptgetloginId(HttpServletRequest request){
		/**
		 * 获取Cookie中的code
		 */
		String code = null;
		Cookie[] cookie = request.getCookies();//获取的是请求里的所有cookie组成的数组
		if(cookie != null){
			for(int i=0;i<cookie.length;i++){
			    if("code".equals(cookie[i].getName())){
			    	if(cookie[i].getValue() != null && cookie[i].getValue().toString().length() > 0){
			    		code = cookie[i].getValue();
			    	}
			    }
			}
		}
		return code;
	}
	
	
	/**
	 * 1、登陆拦截里面的方法
	 * 获取的是客户端被拦截的请求的路径
	 */
	public static String getClient_url(HttpServletRequest request){
		// 获取?后面的请求参数
		Map<String, String[]> params = request.getParameterMap();
        String queryString = "";
        for (String key : params.keySet()) {
            String[] values = params.get(key);
            for (int i = 0; i < values.length; i++) {
                String value = values[i];
                queryString += key + "=" + value + "&";
            }
        }
        // 补充?连接
        if(queryString != null && queryString.length()>0){
        	queryString  = "?"+queryString.substring(0, queryString.length() - 1);
        }
        // 客户端被拦截的请求
        return request.getRequestURL()+queryString;
	}
	
	
	/**
	 * 2、从客户端,请求服务端请求
	 * 通过接口的形式向服务端请求,判断业务系统是否有权限登陆
	 * 服务端根据请求的ip在数据库中查询判断是否有权限
	 * 如果有,重定向到sso登陆页面的接口
	 * 没有,重定向到非法登陆页面的接口
	 * @param client_url 被登陆拦截的请求
	 * @param intercept_url 登陆成功后重新定向到客户端的接口(http://localhost:8080/client)
	 */
	public static String authentication(String client_url, String intercept_url){
		/**
		 * 1、想通过接口的形式向服务端请求,服务端根据请求的ip在数据库中查询判断是否有权限
		 */
		String userInfoUrl = Constant.SSO_INTERFACE_AUTHENTICATION;
		OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
		
		// str是在向sso验证是否有接入权限时,sso接口返回的值,跳转登陆页面的时候需要再一次验证
		String str = null;
		try {
	        OAuthClientRequest userInfoRequest = new OAuthBearerClientRequest(userInfoUrl).setAccessToken("").buildQueryMessage();
	        OAuthResourceResponse resourceResponse = oAuthClient.resource(userInfoRequest, OAuth.HttpMethod.GET, OAuthResourceResponse.class);
	        str = resourceResponse.getBody();
		} catch (OAuthSystemException e) {
			e.printStackTrace();
		} catch (OAuthProblemException e) {
			e.printStackTrace();
		}
		
		if(str.equals("clientPrompt")){  // 有多个客户端ip对应的请求配置
        	return "redirect:"+Constant.SSO_INTERFACE_CLIENTPROMPT;
        }else if(str.equals("notSettingip")){  // 未获取到客户端ip对应的请求配置
        	return "redirect:"+Constant.SSO_INTERFACE_NOTSETTINGIP;
        }else if(str.equals("settingfalse")){  // 当前客户端请求有效期设置失败
        	return "redirect:"+Constant.SSO_INTERFACE_SETTINGFALSE;
        }else{
        	String requestUrl  = Constant.SSO_INTERFACE_LOGINPAGE+
					"?client_url="+client_url+
					"&intercept_url="+intercept_url+
					"&str="+str;
			return "redirect:"+requestUrl;
        }
	}
	
	
	/**
	 * 客户端接口通过oauth的方法进行接口请求,传入code和重定向的路径参数获取loginId
	 */
	public static String getLoginId(String code, String client_url){
		
		if(code != null && code.length() > 0){
			/**
			 * 1、想通过接口的形式向服务端请求,服务端根据请求的ip在数据库中设置这个ip请求的有效时间
			 */
			String userInfoUrl = Constant.SSO_INTERFACE_GETLOGINID;
			OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
			String loginIds = null;
			String loginId = null;
			try {
				OAuthClientRequest userInfoRequest = new OAuthBearerClientRequest(userInfoUrl).setAccessToken(code+"&&&"+client_url).buildQueryMessage();
		        OAuthResourceResponse resourceResponse = oAuthClient.resource(userInfoRequest, OAuth.HttpMethod.GET, OAuthResourceResponse.class);
		        loginIds = resourceResponse.getBody();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			if(loginIds.equals("unlawful")){  // 当前客户端非法请求
	        	return "unlawful";
	        }else if(loginIds.equals("requestOvertime")){  // 当前客户端请求超时
	        	return "requestOvertime";
	        }else{
	        	//对loginIds进行解密获取loginId
	        	try {
	        		loginId = RandomMD5.aesDecrypt(loginIds, Constant.AES_KEY_PRO);
				} catch (Exception e) {
					e.printStackTrace();
				}
	        	return loginId;
	        }
		}else{
			return "unlawful";
		}
	}
	
}
